package interfaces;
/**
 * 接口的使用
 * 1、接口使用 interface 来定义
 * 2、Java中，接口和类是并列的结构
 * 3、如何定义接口中的成员
 *              3.1、JDK7及以前，只能定义全局常量和抽象方法
 *                      >全局常量: public static final 的，但是书写时，可以省略不写
 *                      >抽象方法: public abstract 的
 *              3.2、JDK8: 还能定义静态方法和默认方法(略)
 *
 * 4、接口中不能定义构造器，意味着接口不可以实例化
 *
 * 5、Java开发中，接口通过(implements)的方式去使用
 *      如果实现类覆盖了接口中的所有抽象方法，则此实现类就可以实例化
 *      如果实现类没有覆盖接口中的所有抽象方法，则此实现类任为一个抽象类
 *
 * 6、Java类可以实现多个接口 ---> 弥补了Java单继承性的局限性
 *      格式:  class A extends BB implements CC,DD,EE
 *
 * 7、接口与接口之间可以继承，而且可以多继承
 ***********************************************************
 * 8、接口的具体使用，体现多态性
 * 9、接口，实际上可以看做是一种规范
 */
public class InterfaceTest {
    public static void main(String[] args) {
        System.out.println(Flyable.MAX_SPEED);
        System.out.println(Flyable.MIN_SPEED);
//        Flyable.MIN_SPEED = 2;//无法为最终变量MIN_SPEED分配值
        Test t = new Test();
        t.fly();
        t.stop();
        Flyable.addSpeed();
        Flyable f = new Test();
//        f.addSpeed();//静态接口方法调用非法
        f.go();
        t.go();

        System.out.println("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~");

        Bullet bullet = new Bullet();
        bullet.fly();
        bullet.stop();
        bullet.attack();

    }

}
interface Attackable{
    void attack();
}

interface Flyable{
    //全局变量
    public static final int MAX_SPEED = 7900;//第一宇宙速度
    int MIN_SPEED = 1;

    //抽象方法
    public abstract void fly();
    //省略了 public abstract
    void stop();

    public default void go(){
        System.out.println("何艺庆抬手就飞了");
    }

    public static void addSpeed(){//接口内的静态方法只能用 接口名.方法名 调用
        System.out.println("何艺庆撒个尿加速");
    }
}

class Test implements Flyable{

    @Override
    public void fly() {
        System.out.println("嘟嘟嘟！何艺庆起飞");
    }

    @Override
    public void stop() {
        System.out.println("何艺庆放个屁就停了");
    }
}

class Bullet implements Flyable,Attackable,CC{

    @Override
    public void fly() {
        System.out.println("子弹可以飞");
    }

    @Override
    public void stop() {
        System.out.println("子弹打中人会停下");
    }

    @Override
    public void attack() {
        System.out.println("子弹打中人会受伤");
    }

    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }
}

//******************************************

interface AA{
    void method1();
}

interface BB{
    void method2();
}

interface CC extends AA,BB{

}